package Dic;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 说明: 1.每个汉字有个二进制编码,叫汉字国标码. 
 * 2.GB2312-80 GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节.
 * 3.区位码:十进制区码+十进制位码 
 * 4.国际码(GB):(十六进制区码+20H)+(十六进制位码+20H)
 * 5.机内码:将国标码的每个字节都加上128,即将两个字节的最高位由0改1,其余7位不变
 * 6.16-55区为一级汉字,按拼音排序;56-87区为二级汉字,按部首/笔画排序.
 */
public class GB2312 {
	public final static int DRI16 = 16;
	public final static int DRI55 = 55;
	public final static int DRI56 = 56;
	public final static int DRI87 = 87;
	public final static int MIN_POS = 1;
	public final static int MAX_POS = 94;
	
	 /**
     * 把所有GB2312包括的字载入List
     * @return List<String> 
     * @author wdj
     * */
	public List<String> loadGB2312ToList() throws UnsupportedEncodingException  {
		 List<String> list=new ArrayList<String>();
     	/** 定义字节数组,长度为2,分别用于存放高位字节和地位字节 */
		int index = 1;
		byte[] gbBytes = new byte[2];
		for (int d = DRI16; d <= DRI55; d++) {
			/** 第一个字节(高位字节)+20H即十进制32 */
			int high_pos = d + 32;
			/** 第一个字节(高位字节)+128 */
			high_pos += 128;
			/** 给第一个字节(高位字节)赋值 */
			gbBytes[0] = (byte) high_pos;
			for (int p = MIN_POS; p <= MAX_POS; p++) {
				/** 第二个字节(低位字节)+20H即十进制32 */
				int low_pos = p + 32;
				/** 第二个字节(地位字节)+128 */
				low_pos += 128;
				/** 第二个字节(地位字节)赋值 */
				gbBytes[1] = (byte) low_pos;
				/** 构造汉字字符并输出,下面就是见证奇迹的时刻 */
				String ccStr = new String(gbBytes, "GB2312");
				if (!(d == DRI55 && p >= 90)) {
					//System.out.println("第" + (index++) + "个汉字是:"+ccStr);
					list.add(ccStr);
				}
			}
		}
		for (int d = DRI56; d <= DRI87; d++) {
			/** 第一个字节(高位字节)+20H即十进制32 */
			int high_pos = d + 32;
			/** 第一个字节(高位字节)+128 */
			high_pos += 128;
			/** 给第一个字节(高位字节)赋值 */
			gbBytes[0] = (byte) high_pos;
			for (int p = MIN_POS; p <= MAX_POS; p++) {
				/** 第二个字节(低位字节)+20H即十进制32 */
				int low_pos = p + 32;
				/** 第二个字节(低位字节)+128 */
				low_pos += 128;
				/** 第二个字节(低位字节)赋值 */  
				gbBytes[1] = (byte) low_pos;
				/** 构造汉字字符并输出,下面就是见证奇迹的时刻 */
				String ccStr = new String(gbBytes, "GB2312");
				//System.out.println("第" + (index++) + "个汉字是:"+ccStr);
				list.add(ccStr);
			}
		}
		return list;
    };
	public static void main(String[] args)throws Exception{
		int count=1;
		for(String str:new GB2312().loadGB2312ToList()){
			System.out.println(count+++":"+str);
		};
	}
}
